package donkeykong;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JPanel;

public class Puntuacion_total extends JPanel implements Runnable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/** Puntuacion total del jugador **/
	private int puntuacion;
	
	/** Top puntuacion del juego **/
	private int Max_puntuacion;
	
	/** LVL del juego **/
	private int Level;
	
	/**Tiempo restante **/
	private int Tiempo;
	
	/**Referencia a Mario, para cuando se acabe el tiempo, matarlo **/
	private Mario mario;
	
	private Image panel, cero,uno, dos, tres, cuatro, cinco, seis, siete, ocho, nueve;

	private boolean acabado;

	private Clip clickClip;

	private AudioInputStream musicaSonido;

	private boolean sonando;
	
	private int TECLA_ARRIBA;
	private int TECLA_ABAJO;
	private int TECLA_DERECHA;
	private int TECLA_IZQUIERDA;
	private int TECLA_SALTO;
	private int TECLA_START;

	private boolean pasado_1 = false;

	private boolean pasado_10 = false;

	private boolean pasado_9 = false;

	private boolean pasado_8 = false;

	private boolean pasado_7 = false;

	private boolean pasado_6 = false;

	private boolean pasado_5 = false;

	private boolean pasado_4 = false;

	private boolean pasado_3 = false;

	private boolean pasado_2 = false;
	
	
	
	public Puntuacion_total(int i, int j, int k, int l, int m, int n, int level){
		try {
			
			setTECLA_ARRIBA(j);
			setTECLA_ABAJO(i);
			setTECLA_DERECHA(k);
			setTECLA_IZQUIERDA(l);
			setTECLA_SALTO(m);
			setTECLA_START(n);
			
			puntuacion=0;
			Tiempo = 5000;
			Level = level;
			sonando = false;
			
			panel = ImageIO.read(new File("./images/panel_datos/marcador.png"));
			cero = ImageIO.read(new File("./images/panel_datos/cero.png"));
			uno = ImageIO.read(new File("./images/panel_datos/uno.png"));
			dos = ImageIO.read(new File("./images/panel_datos/dos.png"));
			tres = ImageIO.read(new File("./images/panel_datos/tres.png"));
			cuatro = ImageIO.read(new File("./images/panel_datos/cuatro.png"));
			cinco = ImageIO.read(new File("./images/panel_datos/cinco.png"));
			seis = ImageIO.read(new File("./images/panel_datos/seis.png"));
			siete = ImageIO.read(new File("./images/panel_datos/siete.png"));
			ocho = ImageIO.read(new File("./images/panel_datos/ocho.png"));
			nueve = ImageIO.read(new File("./images/panel_datos/nueve.png"));

			
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	public void setMario(Mario m){
		mario = m;
	}
	
	/**Aņadir puntuacion, y mirar si se supera una cierta, aņadir vida a mario **/
	public void aņadirPuntuacion(int inc_puntuacion){
		puntuacion += inc_puntuacion;
		if (Max_puntuacion < puntuacion){
			Max_puntuacion = puntuacion;
		}
		if (Max_puntuacion>18000*1){
			if (!pasado_1){
				mario.AumentarVidas();
				pasado_1=true;
			}
		}else if (Max_puntuacion>18000*2){
			if (!pasado_2){
				mario.AumentarVidas();
				pasado_2=true;
			}
		}else if (Max_puntuacion>18000*3){
			if (!pasado_3){
				mario.AumentarVidas();
				pasado_3=true;
			}
		}else if (Max_puntuacion>18000*4){
			if (!pasado_4){
				mario.AumentarVidas();
				pasado_4=true;
			}
		}else if (Max_puntuacion>18000*5){
			if (!pasado_5){
				mario.AumentarVidas();
				pasado_5=true;
			}
		}else if (Max_puntuacion>18000*6){
			if (!pasado_6){
				mario.AumentarVidas();
				pasado_6=true;
			}
		}else if (Max_puntuacion>18000*7){
			if (!pasado_7){
				mario.AumentarVidas();
				pasado_7=true;
			}
		}else if (Max_puntuacion>18000*8){
			if (!pasado_8){
				mario.AumentarVidas();
				pasado_8=true;
			}
		}else if (Max_puntuacion>18000*9){
			if (!pasado_9){
				mario.AumentarVidas();
				pasado_9=true;
			}
		}else if (Max_puntuacion>18000*10){
			if (!pasado_10){
				mario.AumentarVidas();
				pasado_10=true;
			}
		}
	}
	
	public void pasarNivel(){
		Level++;
	}
	
	
	public void paintComponent(Graphics g){
		super.paintComponents(g);
		
		Graphics2D g2d = (Graphics2D) g;
		AffineTransform at = new AffineTransform();
		at.scale(3.5, 2);
		at.translate(0, 0);
		g2d.drawImage(panel, at, null);
		
		int PuntuacionAux = puntuacion;
		/** Puntuacion actual **/
		for (int i=1;i<=6;i++){
			AffineTransform at2 = new AffineTransform();
			at2.scale(3.5, 2);
			at2.translate(62-8*i, 12);
			int numero = PuntuacionAux % 10;
			PuntuacionAux = PuntuacionAux/10;
			g2d.drawImage(pintarNumero(numero), at2, null);
		}

		int PuntuacionTOPAux = Max_puntuacion;
		/** Puntuacion TOP **/
		for (int i=1;i<=6;i++){
			AffineTransform at2 = new AffineTransform();
			at2.scale(3.5, 2);
			at2.translate(154-8*i, 12);
			int numero = PuntuacionTOPAux % 10;
			PuntuacionTOPAux = PuntuacionTOPAux/10;
			g2d.drawImage(pintarNumero(numero), at2, null);
		}

		/** Vidas Mario **/
		AffineTransform atVidas = new AffineTransform();
		atVidas.scale(3.4, 2);
		atVidas.translate(147, 27);
		g2d.drawImage(pintarNumero(mario.getVidas()), atVidas, null);

		int TiempoAux = Tiempo;
		/** Tiempo restante **/
		for (int i=1;i<=4;i++){
			AffineTransform atTiempo = new AffineTransform();
			atTiempo.scale(3.2, 2);
			int numero = TiempoAux % 10;
			TiempoAux = TiempoAux/10;
			atTiempo.translate(205-8*i, 27);
			g2d.drawImage(pintarNumero(numero), atTiempo, null);
		}
		
		/** LVL Actual **/
		AffineTransform atLVL = new AffineTransform();
		atLVL.scale(3.4, 2);
		atLVL.translate(201, 27);
		g2d.drawImage(pintarNumero(Level), atLVL, null);
		
	}


	private Image pintarNumero(int numero) {
		return ((numero==0)? cero : ((numero==1)? uno : ((numero==2)? dos : ((numero==3)? tres : ((numero==4)? cuatro : 
			((numero==5)? cinco : ((numero==6)? seis : ((numero==7)? siete : ((numero==8)? ocho : nueve)))))))));
	}


	@Override
	public void run() {
		try {
			while (Tiempo > 0){
				if (!acabado){
					Thread.sleep(1500);
					Tiempo = Tiempo - 100;
				}else{
					break;
				}
				if (!sonando){
					if (Tiempo<=1000){
						escucharSonido("Time_out", 0);
						sonando=true;
					}
				}
				
			}
			Thread.sleep(1500);
			/** Si el Tiempo se ha agotado, matar a Mario **/
			if (Tiempo==0){
				pararSonido();
				mario.Muriendo();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/** Funcion que permite reproducir un sonido
	 * 
	 * @param sonido : Nombre (sin extension) del sonido a reproducir
	 * @param duracion : Duracion de la musica por si qse quiere repetir indefinidamente o solo unas veces
	 */
	public void escucharSonido(String sonido, int duracion){
		try {
			clickClip = AudioSystem.getClip();
			musicaSonido = AudioSystem.getAudioInputStream(new File("./sounds/"+sonido+".wav"));
			clickClip.open(musicaSonido);
			clickClip.loop(duracion);
			clickClip.start();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	/** Funcion que se utiliza para parar el sonido, si esta activado **/
	public void pararSonido(){
		if(clickClip != null){
			clickClip.stop();
		}
	}


	public void Acabar() {
		acabado=true;		
	}


	public int getTiempo() {
		return Tiempo;
	}
	
	
	public void ReiniciarTiempo(){
		Tiempo=5000;
		sonando = false;
	}
	
	public int obtenerPuntuacion(){
		return puntuacion;
	}


	public int getTECLA_ARRIBA() {
		return TECLA_ARRIBA;
	}


	private void setTECLA_ARRIBA(int tECLA_ARRIBA) {
		TECLA_ARRIBA = tECLA_ARRIBA;
	}


	public int getTECLA_ABAJO() {
		return TECLA_ABAJO;
	}


	private void setTECLA_ABAJO(int tECLA_ABAJO) {
		TECLA_ABAJO = tECLA_ABAJO;
	}


	public int getTECLA_DERECHA() {
		return TECLA_DERECHA;
	}


	public void setTECLA_DERECHA(int tECLA_DERECHA) {
		TECLA_DERECHA = tECLA_DERECHA;
	}


	public int getTECLA_IZQUIERDA() {
		return TECLA_IZQUIERDA;
	}


	public void setTECLA_IZQUIERDA(int tECLA_IZQUIERDA) {
		TECLA_IZQUIERDA = tECLA_IZQUIERDA;
	}


	public int getTECLA_SALTO() {
		return TECLA_SALTO;
	}


	public void setTECLA_SALTO(int tECLA_SALTO) {
		TECLA_SALTO = tECLA_SALTO;
	}


	public int getTECLA_START() {
		return TECLA_START;
	}


	public void setTECLA_START(int tECLA_START) {
		TECLA_START = tECLA_START;
	}
	
}
